ARD2  RC2
Airbag Reference Demonstrator using MPC5604P
CRC.c
Go to the documentation of this file.
00001 
00016 #include "derivative.h"
00017 #include "CRC.h"
00018 #include "EDMA.h"
00019 /*
00020  ******************************************************************************
00021  * Constants
00022  ******************************************************************************
00023  */
00024 static const uint8_t cau8CRCConfigs[] =
00025 {
00026   /* CRC32 has been tested and validated */
00027   /* CRC_CCITT hasn't */
00028   (CRC_INSTANCE_0_MASK | CRC_CCITT | CRC_NO_MSB_SWAP | CRC_NO_RESULT_INV),
00029   (CRC_INSTANCE_1_MASK | CRC_CCITT | CRC_NO_MSB_SWAP | CRC_NO_RESULT_INV),
00030   (CRC_INSTANCE_0_MASK | CRC_32 | CRC_MSB_SWAP | CRC_RESULT_INV),
00031   (CRC_INSTANCE_1_MASK | CRC_32 | CRC_MSB_SWAP | CRC_RESULT_INV) };
00032 /*
00033  ******************************************************************************
00034  * Globals
00035  ******************************************************************************
00036  */
00038 static vuint32_t* gpau32CRCResults[2u];
00039 /*
00040  ******************************************************************************
00041  * vfnInitCRC
00042  ******************************************************************************
00043  */
00044 void vfnInitCRC(uint8_t u8Instance, uint32_t u32Remainder)
00045 {
00046   /* Purpose of this fn is ensure that we have nothing going on in a given */
00047   /* instance */
00048   /* Limit the number of instances to the possible HW combinations. In this */
00049   /* case, this means two. */
00050   u8Instance = (u8Instance > CLEAR);
00051   
00052   /* Make sure that the global pointer to the result is empty */
00053   gpau32CRCResults[u8Instance] = (uint32_t*)CLEAR;
00054   
00055   /* Make sure that the instance contains no data */
00056   CRC.CNTX[u8Instance].CRC_INP.W = CLEAR;
00057   CRC.CNTX[u8Instance].CRC_CSTAT.W = u32Remainder;
00058   
00059   return;
00060 }
00061 /*
00062  ******************************************************************************
00063  * u8fnCRC
00064  ******************************************************************************
00065  */
00066 uint8_t u8fnCRC(const uint8_t* pu8StartAddress,
00067                 const uint32_t u32NOfBytes,
00068                 uint32_t* pu32Result,
00069                 const uint32_t u32Remainder,
00070                 const uint8_t u8DMAChannel,
00071                 const uint8_t u8CRCConfig)
00072 {
00073   uint8_t u8Status;
00074   CRCConfig_t tCRCConfig;
00075   
00076   u8Status = u8fnDMAPending(u8DMAChannel);
00077   tCRCConfig = *(CRCConfig_t*)&(cau8CRCConfigs[u8CRCConfig]);
00078   
00079   if(CLEAR == u8Status)
00080   {
00081     /* Reset CRC channel */
00082     vfnInitCRC(tCRCConfig.P.Instance, u32Remainder);
00083     
00084     /* Configure a DMA channel for this operation */
00085     vfnCRCConfigDMA(pu8StartAddress, u32NOfBytes, u8DMAChannel, tCRCConfig);
00086     
00087     /* Configure CRC. */
00088     vfnCRCConfig(*(CRCConfig_t*)&(cau8CRCConfigs[u8CRCConfig]));
00089     
00090     /* Remember pointer */
00091     gpau32CRCResults[tCRCConfig.P.Instance] = pu32Result;
00092     
00093     /* Start */
00094     vfnDMAStart(u8DMAChannel);
00095   }
00096   else
00097   {
00098     /* Return status */
00099   }
00100   return;
00101 }
00102 /*
00103  ******************************************************************************
00104  * vfnCRCConfig
00105  ******************************************************************************
00106  */
00107 static void vfnCRCConfig(CRCConfig_t tConfig)
00108 {
00109   CRC.CNTX[tConfig.P.Instance].CRC_CFG.W = (uint32_t)(tConfig.A & 0x0Fu);
00110   
00111   return;
00112 }
00113 /*
00114  ******************************************************************************
00115  * vfnCRCConfigDMA
00116  ******************************************************************************
00117  */
00118 static void vfnCRCConfigDMA(const uint8_t* pu8StartAddress,
00119                             const uint32_t u32NOfBytes,
00120                             const uint8_t u8DMAChannel,
00121                             const CRCConfig_t tCRCConfig)
00122 {
00123   
00124   TCD_t tMyDefaultConfig;
00125   
00126   
00127   /* Source address is the start address for our CRC */
00128   tMyDefaultConfig.P.SADDR = (uint32_t)pu8StartAddress;
00129   /* Destination address is our CRC module input */
00130   tMyDefaultConfig.P.DADDR
00131       = (uint32_t)(&(CRC.CNTX[tCRCConfig.P.Instance].CRC_INP.B));
00132   /* Modulus is 0 */
00133   tMyDefaultConfig.P.SMOD = CLEAR;
00134   tMyDefaultConfig.P.DMOD = CLEAR;
00135   /* We will transfer 32-bit words */
00136   tMyDefaultConfig.P.SSIZE = DMA_SIZE_8_BIT;
00137   tMyDefaultConfig.P.DSIZE = DMA_SIZE_8_BIT;
00138   tMyDefaultConfig.P.SOFF = 1u; /* Offset per minor loop (in bytes) */
00139   tMyDefaultConfig.P.DOFF = 0u; /* Destination offset per minor loop */
00140   tMyDefaultConfig.P.NBYTES = u32NOfBytes; /* Inner loop transfer count (in bytes) */
00141   tMyDefaultConfig.P.SLAST = CLEAR;
00142   tMyDefaultConfig.P.CITERE_LINK = CLEAR;
00143   tMyDefaultConfig.P.BITERE_LINK = CLEAR;
00144   tMyDefaultConfig.P.CITER = 1u; /* Times we will execute the major loop */
00145   tMyDefaultConfig.P.BITER = 1u; /* Memory for the loop */
00146   tMyDefaultConfig.P.D_REQ = TRUE; /* Clear HW Start requests after major loop is done */
00147   
00148   tMyDefaultConfig.P.DLAST_SGA = CLEAR; /* Last destination offset */
00149   tMyDefaultConfig.P.MAJORLINKCH = CLEAR;
00150   tMyDefaultConfig.P.BWC = DMA_BWC_4_CYCLE_STALL;
00151   tMyDefaultConfig.P.MAJORE_LINK = CLEAR; /* Disable ch2ch linking */
00152   tMyDefaultConfig.P.E_SG = CLEAR;
00153   
00154   tMyDefaultConfig.P.INT_HALF = CLEAR;
00155   tMyDefaultConfig.P.INT_MAJ = TRUE;
00156   tMyDefaultConfig.P.START = CLEAR;
00157   
00158   vfnDMAConfig(&tMyDefaultConfig, u8DMAChannel);
00159   
00160   return;
00161 }
00162 /*
00163  ******************************************************************************
00164  * vfnCRCIsr
00165  ******************************************************************************
00166  */
00167 static void vfnCRCIsr(uint8_t u8Instance)
00168 {
00169   *gpau32CRCResults[u8Instance] = CRC.CNTX[u8Instance].CRC_OUTP.W;
00170   
00171   return;
00172 }
00173 /*
00174  ******************************************************************************
00175  * vfnCRC0Isr
00176  ******************************************************************************
00177  */
00178 void vfnCRC0Isr(void)
00179 {
00180   DMA_CLEAR_ISR_FLAG(CRC_DMA_CH_0);
00181   EDMA.TCD[CRC_DMA_CH_1].DONE = TRUE;
00182   vfnCRCIsr(CRC_INSTANCE_0);
00183   
00184   return;
00185 }
00186 /*
00187  ******************************************************************************
00188  * vfnCRC1Isr
00189  ******************************************************************************
00190  */
00191 void vfnCRC1Isr(void)
00192 {
00193   DMA_CLEAR_ISR_FLAG(CRC_DMA_CH_1);
00194   EDMA.TCD[CRC_DMA_CH_1].DONE = CLEAR;
00195   vfnCRCIsr(CRC_INSTANCE_1);
00196   
00197   return;
00198 }
00199 /*
00200  ******************************************************************************
00201  *
00202  *  End of file.
00203  *
00204  ******************************************************************************
00205  */